
/**
 * 
 * 热点网站统计
 * 
 * 题目描述

企业路由器的统计页面，有一个功能需要动态统计公司访问最多的网页 URL top N。

请设计一个算法，可以高效动态统计 Top N 的页面。

输入描述
每一行都是一个URL或一个数字

如果是 URL，代表一段时间内的网页访问
如果是一个数字 N，代表本次需要输出的 Top N 个 URL
输入约束：

总访问网页数量小于 5000 个，单网页访问次数小于 65535 次
网页 URL 仅由字母，数字和点分隔符组成，且长度小于等于 127 字节
数字是正整数，小于等于 10 且小于当前总访问网页数
输出描述
每行输入要对应一行输出，输出按访问次数排序的前 N 个 URL，用逗号分隔。

输出要求：

每次输出要统计之前所有输入，不仅是本次输入
如果有访问次数相等的 URL，按 URL 的字符串字典序升序排列，输出排序靠前的 URL
用例
输入	news.qq.com
news.sina.com.cn
news.qq.com
news.qq.com
game.163.com
game.163.com
www.huawei.com
www.cctv.com
3
www.huawei.com
www.cctv.com
www.huawei.com
www.cctv.com
www.huawei.com
www.cctv.com
www.huawei.com
www.cctv.com
www.huawei.com
3
输出	news.qq.com,game.163.com,news.sina.com.cn
www.huawei.com,www.cctv.com,news.qq.com
说明	无
输入	news.qq.com
www.cctv.com
1
www.huawei.com
www.huawei.com
2
3
输出	news.qq.com
www.huawei.com,news.qq.com
www.huawei.com,news.qq.com,www.cctv.com
说明	无


 */

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;

/**
  * 
  题目解析
本题考察的是多条件排序。

需要统计各个URL访问次数，按照访问次数降序，如果访问次数相同，则按照URL字典序升序。

本题的输入无截止条件，即不定行输入，关于不定行输入的处理可以看下：

ACM模式不定行输入获取-CSDN博客
https://fcqian.blog.csdn.net/article/details/132385403
  */
public class 热点网站统计 {
    
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
 
        HashMap<String, Integer> count = new HashMap<>();
 
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
 
            try {
                int n = Integer.parseInt(line);
 
                List<String> collect = count.entrySet().stream().sorted((a, b) -> {
                    if (a.getValue() - b.getValue() != 0) {
                        return b.getValue() - a.getValue();
                    } else {
                        return a.getKey().compareTo(b.getKey());
                    }
                }).limit(n).map(Map.Entry::getKey).collect(Collectors.toList());
 
                System.out.println(String.join(",", collect));
            } catch (Exception e) {
                count.put(line, count.getOrDefault(line, 0) + 1);
            }
        }
    }
}
